package com.example.erp.config;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.InMemoryChatMemoryRepository;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 聊天客户端配置类
 */
@Configuration
public class ChatClientConfig {

	@Autowired
	private ToolCallbackProvider toolCallbackProvider;

    private final int MAX_MESSAGES = 100;
    private final InMemoryChatMemoryRepository chatMemoryRepository = new InMemoryChatMemoryRepository();
    private final MessageWindowChatMemory messageWindowChatMemory = MessageWindowChatMemory.builder()
            .chatMemoryRepository(chatMemoryRepository)
            .maxMessages(MAX_MESSAGES)
            .build();
	/**
	 * 配置ChatClient，注册系统指令和工具函数
	 */
	@Bean
	ChatClient chatClient(ChatClient.Builder builder) {
		return builder
				.defaultSystem(
						"你是一个图书管理助手，可以帮助用户查询图书信息。" 
				+ "你可以根据书名模糊查询、根据作者查询和根据分类查询图书。" 
				+ "回复时，请使用简洁友好的语言，并将图书信息整理为易读的格式。")
				.defaultAdvisors(MessageChatMemoryAdvisor.builder(messageWindowChatMemory).build())   
				// 注册工具方法
				.defaultToolCallbacks(toolCallbackProvider)
				.build(); 
	}
 
	/**
	 *  在 BookQueryService 中单独声明一个类将查询方法作为函数Bean导出时，
	 *  在定义AI聊天客户端的时候需要显式地声明。
	 */
//	@Bean
//	ChatClient chatClient2(ChatClient.Builder builder) {
//		return builder
//				.defaultSystem(
//						"你是一个图书管理助手，可以帮助用户查询图书信息。" 
//				+ "你可以根据书名模糊查询、根据作者查询和根据分类查询图书。" 
//				+ "回复时，请使用简洁友好的语言，并将图书信息整理为易读的格式。")
//				// 注册工具方法，这里使用方法名称来引用Spring上下文中的函数Bean
//				.defaultTools(
//	                    "findBooksByTitle",
//	                    "findBooksByAuthor",
//	                    "findBooksByCategory"
//	            ).build();
//	}
}
